home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / reset.r < prev    next >
Text File  |  1994-10-27  |  7KB  |  237 lines

  1. ;---;  RESET  ;--------------------------------------------------------------------
  2. *
  3. *    ****    RESET ROUTINE    ****
  4. *
  5. *    Author        Daniel Weber
  6. *    Version        1.13
  7. *    Last Revision    14.02.93
  8. *    Identifier    rtr_defined
  9. *       Prefix        rtr_    (Reset Routine)
  10. *                 ¯   ¯ ¯
  11. *    Functions    ColdReboot()
  12. *
  13. ;------------------------------------------------------------------------------
  14. *
  15. *                           Amiga Software Reboot
  16. *
  17. *                          By Daniel Weber in 1990
  18. *
  19. *        * Based on the offical reboot code published by Commodore *
  20. *
  21. *                    - The entire risk as to the use of this -
  22. *                    -  information is assumed by the user   -
  23. *
  24. *     For more information read "The Official Way to Software Reboot an
  25. *     Amiga" from the July/August 1989 issue of Amiga Mail, Exec,
  26. *     page III-9.
  27. *
  28. *
  29. *     The ColdReboot() function listed below should be used whenever an
  30. *     application needs to reboot the Amiga.
  31. *     This code represents the *best* available general purpose reset.
  32. *
  33. *
  34. *     TECHNICAL DESCRIPTION:
  35. *     The code below turns an installed MMU off, precalculates a jump
  36. *     address, executes a RESET instruction, then relies on CPU
  37. *     prefetch to execute the jump. The precalculated jump is
  38. *     constructed to enter the system ROM at the location of a second
  39. *     RESET instruction.
  40. *
  41. ;------------------------------------------------------------------------------
  42. *
  43. *       NAME                                                                
  44. *           ColdReboot
  45. *
  46. *       SYNOPSIS
  47. *           ColdReboot()
  48. *
  49. *           void ColdReboot(void);
  50. *
  51. *       FUNCTION
  52. *           Reboot the machine. Turn an installed MMU off, all external
  53. *           memory and peripherals will be RESET, and the machine will
  54. *           start its power up diagnostics.                                 
  55. *
  56. *       NOTE                                                                
  57. *           Rebooting an Amiga in software is very tricky. Differing
  58. *           memory configurations and processor cards require careful
  59. *           treatment. This code represents the *best* available
  60. *           general purpose reset.                                          
  61. *
  62. *           The MagicResetCode must be used exactly as specified here.
  63. *           The code *must* be longword aligned. Failure to duplicate
  64. *           the code *exactly* may result in improper operation under       
  65. *           certain system configurations.
  66. *
  67. *       RESULT
  68. *           This function never returns.                                    
  69. *
  70. ;------------------------------------------------------------------------------
  71.  
  72. ;------------------
  73.     IFND    rtr_defined
  74. rtr_defined    =1
  75.  
  76. ;------------------
  77. rtr_oldbase    equ __BASE
  78.     base    rtr_base
  79. rtr_base:
  80.  
  81.  
  82. ;
  83. ;--------------------------------------------------------------------
  84. ;
  85.         opt sto            ;only for the ProAsm assembler
  86.         opt o+,ow-,q+
  87.  
  88.         mc68030            ;use the MC68030 for the MMU coding
  89. ;
  90. ;--------------------------------------------------------------------
  91. ;
  92.  
  93.  
  94. rtr_MAGIC_ROMEND    EQU $01000000    ;End of Kickstart ROM
  95. rtr_MAGIC_SIZEOFFSET    EQU -$14    ;Offset from end of ROM to Kickstart size
  96. rtr_V36_EXEC           EQU 36            ;Exec with the ColdReboot() function
  97. rtr_TEMP_ColdReboot     EQU -726    ;Offset of the V36 ColdReboot function
  98. ;
  99. ;--------------------------------------------------------------------
  100. ;
  101. ColdReboot:    bsr.s    rtr_CacheOff    
  102.         bsr    rtr_killMMU
  103.         move.l    4.w,a6
  104.         cmp.w    #rtr_V36_EXEC,20(a6)
  105.         blt.s    rtr_old_exec
  106.         jmp    rtr_TEMP_ColdReboot(a6)     ;Let Exec do it...
  107. ;
  108. ;    NOTE: Control flow never returns to here
  109. ;
  110. ;--- manually reset the Amiga ---------------------------------------
  111. ;
  112. rtr_old_exec:
  113.         lea    rtr_GoAway(pc),a5    ;address of code to execute
  114.         jsr    -30(a6)            ;trap to code at (a5)
  115. ;
  116. ;
  117. ;    NOTE: Control flow never returns to here
  118. ;
  119. ;--- MagicResetCode ---------------- PLEASE DO NOT CHANGE -----------
  120. ;
  121.         CNOP 0,4            ;IMPORTANT! Longword align!
  122.  
  123. rtr_GoAway:
  124.          lea    rtr_MAGIC_ROMEND,a0         ;(end of ROM)
  125.         sub.l    rtr_MAGIC_SIZEOFFSET(a0),a0 ;(end of ROM)-(ROM size)=PC
  126.         move.l    4(a0),a0                    ;Get Initial Program Counter
  127.         subq.l    #2,a0                ;now points to second RESET
  128.         RESET                    ;first RESET instruction
  129.         jmp (a0)                ;CPU prefetch executes this
  130. ;
  131. ;
  132. ;    NOTE: the RESET an JMP instruction must share a longword!!!
  133. ;
  134. ;
  135. ;--- turn caches off... 
  136. ;
  137. ;
  138. rtr_CacheOff:    move.l    4.w,a6
  139.         btst    #1,AttnFlags+1(a6)    ;AFB_68020
  140.         beq.s    4$            ;at least a 68020 expected
  141.  
  142.         cmp.w    #rtr_V36_EXEC,20(a6)
  143.         blt.s    3$
  144.         moveq    #0,d0
  145.         move.l    #CACRF_ClearI|CACRF_ClearD|CACRF_EnableI|CACRF_EnableD|CACRF_IBE|CACRF_DBE,d1
  146.         jsr    _LVOCacheControl(a6)    ;this function clears all caches
  147.         rts
  148.  
  149. 3$:        lea    5$(pc),a5
  150.         jsr    _LVOSupervisor(a6)
  151. 4$:        rts
  152.  
  153.  
  154. 5$:        move.l    #CACRF_ClearI|CACRF_ClearD|CACRF_WriteAllocate,d0
  155.         movec    d0,cacr
  156.         rte
  157.  
  158. ;
  159. ;--- kill an installed MMU --------- DO NOT CHANGE ANYTHING ! -------
  160. ;
  161. ;
  162. rtr_killMMU:    move.l    4.w,a6
  163.         sub.l    a1,a1            ;look first for a MMU
  164.         jsr    -294(a6)        ;get ThisTask
  165.         move.l    d0,a1
  166.         move.l    50(a1),a2        ;save old TaskException
  167.         pea    rtr_taskexception(pc)
  168.         move.l    (a7)+,50(a1)        ;put own Exceptionhandler in
  169.         moveq    #-1,d0            ;set flag "MMU FOUND"
  170.         subq.l    #4,a7
  171.         nop
  172.         pmove    tc,(a7)
  173.         nop
  174.         nop
  175.         addq.l    #4,a7
  176.         tst.l    d0
  177.         bne.s    1$
  178.         nop
  179.         mc68040
  180.         movec    tc,d1            ;68040 instruction
  181.         mc68030
  182.         nop
  183.         nop
  184.         neg.l    d0            ;-1 => +1 (mc68040)
  185. 1$:        move.l    a2,50(a1)        ;restore old Exceptionhandler
  186.  
  187. rtr_killMMU_now:
  188.         tst.l     d0            ;MMU found???
  189.         beq.s    \no_MMU_around
  190.         lea    rtr_kill_it(pc),a5
  191.         jsr    -30(a6)            ;trap on code at (a5)
  192. \no_MMU_around:    rts
  193.  
  194. ;--------------------------------------------------------------------
  195. rtr_kill_it:                    ;kill MMU
  196.         tst.w    d0
  197.         bpl.s    1$
  198.         clr.l    -(a7)
  199.         pmove    (a7),tc            ;turn 68030/68851 mmu off
  200.         addq.l    #4,a7
  201.         rte                ;back to 'no_MMU_around'
  202.  
  203.         mc68040
  204. 1$:        movec    tc,d0            ;turn 68040 mmu off
  205.         bclr    #15,d0
  206.         movec    d0,tc
  207.         rte
  208.         mc68030
  209.  
  210. ;--------------------------------------------------------------------
  211. rtr_taskexception:
  212.         moveq    #0,d0            ;'NO MMU FOUND'
  213.         move.l    (a7)+,d1        ;load trapnumber in d1
  214.         cmp.w    #4,d1            ;'illegal' (no movec)
  215.         beq.s    1$
  216.         cmp.w    #11,d1            ;'line-f' (no pmove)
  217.         beq.s    1$
  218.         moveq    #-1,d0            ;'MMU FOUND'
  219. 1$:        addq.l    #4,2(a7)    ;adjust PC *after* pmove instruction
  220.         rte
  221.  
  222. ;--------------------------------------------------------------------
  223.  
  224. ;------------------
  225.     base    rtr_oldbase
  226.  
  227. ;------------------
  228.     opt    rcl            ;only for the ProAsm assembler
  229.  
  230. ;------------------
  231.     ENDIF
  232.  
  233. ;--------------------------------------------------------------------
  234.  
  235.         END
  236.  
  237.